package utils

import (
	"image"
	"log"
	"math"
	"os"
	"path/filepath"
	"time"

	"github.com/jung-kurt/gofpdf"
)

// 全局水印状态
var watermarkAdded = make(map[int]bool)

// CreatePdf 创建pdf并且写入数据
//
// 参数
//
//	name: pdf名称
//
// 返回
//
//	string: pdf的绝对路径
//	error: 产生的错误信息
func CreatePdf(name string) (string, error) {
	pdf := gofpdf.New("p", "mm", "A4", "")

	// 添加UTF-8支持的中文字体（需提前准备字体文件）
	// 字体文件路径（微软雅黑字体）
	yaheiFont := "microsoft_yahei"
	pdf.AddUTF8Font(yaheiFont, "", "config/msyh.ttf")

	// 设置页面边距
	const (
		leftMargin   = 15.0 // 左边距
		topMargin    = 15.0 // 顶部边距
		rightMargin  = 15.0 // 右边距
		bottomMargin = 15.0 // 下边距
		lineHeight   = 10.0 // 行高
		paraSpacing  = 6.0  // 段落间距
	)
	pdf.SetMargins(leftMargin, topMargin, rightMargin)
	pdf.SetAutoPageBreak(true, bottomMargin)

	pdf.AddPage()

	// 设置页脚函数（会在每页底部调用）
	pdf.SetFooterFunc(func() {
		// 获取当前页码
		pageNum := pdf.PageNo()

		// 检查是否已添加水印
		if !watermarkAdded[pageNum] {
			addWatermark(pdf, yaheiFont, true, true)
			//addSvgWatermarkWithSpacing(pdf)
			watermarkAdded[pageNum] = true
		}
	})

	pdf.SetFont(yaheiFont, "", 18) // 标题字体及大小
	pdf.SetTextColor(255, 0, 0)    // 设置标题颜色为红色
	title := "PDF文档标题"
	titleWidth := pdf.GetStringWidth(title)
	pageWidth, _ := pdf.GetPageSize()

	// 计算标题居中位置
	titleX := (pageWidth - titleWidth) / 2
	pdf.SetXY(titleX, topMargin)
	pdf.Cell(titleWidth, lineHeight, title)
	pdf.Ln(lineHeight * 2) // 标题后留空

	// 正文样式
	pdf.SetFont(yaheiFont, "", 16)
	pdf.SetTextColor(139, 71, 38)

	// 字体文件路径（黑体）
	//pdf.AddUTF8Font("simhei", "", "resources/font/simhei.ttf")

	// 字体文件路径（苹果平方）
	// pdf.AddUTF8Font("PingFangSC", "", "resources/font/PingFang.ttc")

	// pdf.SetFont("microsoft_yahei", "", 16)

	pdf.SetFont(yaheiFont, "", 16)
	text1 := "这是golang生成的中文PDF文档"
	pdf.CellFormat(0, lineHeight, text1, "", 1, "L", false, 0, "")

	pdf.SetFont(yaheiFont, "", 16)
	mixedText := "混合文本示例 Mixed Text Example: 中文Chinese, 124，Español, Français"
	pdf.MultiCell(0, lineHeight, mixedText, "", "L", false)

	// 报告信息
	pdf.SetFont(yaheiFont, "", 12)
	pdf.SetTextColor(100, 100, 100)
	infoText := "生成时间: " + time.Now().Format("2006-01-02 15:04:05") + " | 报告编号: RPT-2023-0001"
	pdf.CellFormat(0, 8, infoText, "", 1, "C", false, 0, "")
	pdf.Ln(15)

	// 第一段：简介文本
	pdf.SetFont(yaheiFont, "", 14)
	pdf.SetTextColor(0, 0, 0)
	intro := "本报告包含产品性能数据和相关图表，用于展示当前产品在市场中的表现情况。"
	pdf.MultiCell(0, 8, intro, "", "L", false)
	pdf.Ln(12)

	// 添加产品图片
	chartSection(pdf, yaheiFont)

	// 添加表格区域
	tableSection(pdf, yaheiFont)

	// 添加大量内容以触发自动分页
	for range 50 {
		pdf.SetFont(yaheiFont, "", 12)
		pdf.MultiCell(0, 8, "这是自动分页测试内容，用于验证水印在所有页面都能正确显示。", "", "L", false)
		pdf.Ln(4)
	}

	if err := pdf.OutputFileAndClose(name); err != nil {
		log.Printf("pdf保存错误===%+v", err)
	}

	absPath, err := filepath.Abs(name)
	if err != nil {
		log.Printf("获取pdf名称%s绝对路径错误：%+v", absPath, err)
		return "", err
	}

	return absPath, nil
}

// 图表区域
func chartSection(pdf *gofpdf.Fpdf, font string) {
	// 图表标题
	pdf.SetFont(font, "", 16)
	pdf.SetTextColor(0, 0, 100) // 深蓝色
	pdf.CellFormat(0, 15, "销售数据分析", "B", 1, "L", false, 0, "")

	// 图表图片
	chartPath := "config/istockphoto-539953664-2048x2048.jpg"
	if _, err := os.Stat(chartPath); err == nil {
		// 添加图表
		pdf.ImageOptions(chartPath,
			35,         // x: 水平居中
			pdf.GetY(), // y: 当前位置
			140,        // 宽度140mm (占页面宽度的70%)
			0,          // 高度自动计算
			false,      // 不添加链接
			gofpdf.ImageOptions{ImageType: "JPG", ReadDpi: true},
			0,  // 链接ID
			"") // 替代文本

		// 图表描述
		pdf.SetY(pdf.GetY() + 100) // 根据图表高度调整
		pdf.SetFont(font, "", 12)
		pdf.SetTextColor(0, 0, 0)
		pdf.MultiCell(0, 8, "图2. 季度销售趋势图\n数据显示C3 Ultra系列产品在第三季度实现了显著增长，同比增长率达到45%。", "", "C", false)
	} else {
		// 没有图片时的替代内容
		pdf.SetTextColor(200, 0, 0)
		pdf.CellFormat(0, 15, "警告: 销售图表缺失", "", 1, "C", false, 0, "")
		pdf.SetTextColor(0, 0, 0)
	}
	pdf.Ln(20)
}

// 表格区域
func tableSection(pdf *gofpdf.Fpdf, font string) {
	// 表格标题
	pdf.SetFont(font, "", 16)
	pdf.SetTextColor(0, 0, 100) // 深蓝色
	pdf.CellFormat(0, 15, "性能数据对比", "B", 1, "L", false, 0, "")

	// 定义列宽
	colWidth := []float64{40, 35, 35, 40}

	// 表头
	pdf.SetFont(font, "", 12)
	// 浅蓝色背景
	pdf.SetFillColor(230, 240, 250)
	headers := []string{"产品型号", "CPU性能", "内存速度", "电池续航"}

	// 绘制表头行
	for i, header := range headers {
		pdf.CellFormat(colWidth[i], 10, header, "1", 0, "C", true, 0, "")
	}
	pdf.Ln(-1) // 移动到下一行

	// 表格数据
	data := [][]string{
		{"A1 Pro", "82.5", "6.4 Gbps", "12小时"},
		{"B2 Max", "93.2", "7.1 Gbps", "15小时"},
		{"C3 Ultra", "98.7", "7.5 Gbps", "18小时"},
	}

	// 绘制数据行
	pdf.SetFont(font, "", 11)
	for _, row := range data {
		for i, cell := range row {
			// 特殊格式化数值
			var alignStr string
			if i >= 1 && i <= 2 {
				// 数值右对齐
				alignStr = "R"
			} else {
				// 文本左对齐
				alignStr = "L" 
			}

			pdf.CellFormat(colWidth[i], 8, cell, "1", 0, alignStr, false, 0, "")
		}
		pdf.Ln(-1)
	}

	// 表格底部说明
	pdf.SetY(pdf.GetY() + 5)
	pdf.SetFont(font, "", 10)
	pdf.SetTextColor(100, 100, 100)
	pdf.CellFormat(0, 8, "* 数据来源: 2023年第三季度测试报告", "", 1, "L", false, 0, "")
	pdf.Ln(15)
}

// 添加水印
func addWatermark(pdf *gofpdf.Fpdf, font string, addTextWatermark, addImageWatermark bool) {
	// 获取页面尺寸
	pageWidth, pageHeight := pdf.GetPageSize()
	// 保存当前状态
	currentX, currentY := pdf.GetXY()

	// 添加文字水印
	if addTextWatermark {
		// 设置水印字体和透明度
		pdf.SetFont(font, "", 48)
		// pdf.SetTextColor(200, 200, 200) // 浅灰色
		pdf.SetTextColor(255, 0, 0) // 红色
		pdf.SetAlpha(0.3, "Normal") // 60%透明度

		watermarkText := "机密文件 禁止外传"

		// 计算文本宽度
		textWidth := pdf.GetStringWidth(watermarkText)
		textHeight := 48.0 // 近似高度（根据字体大小）

		// 在页面中心添加水印
		// x := (pageWidth - textWidth) / 2
		// y := pageHeight / 2
		// pdf.Text(x, y, watermarkText)

		// // 添加旋转水印（45度角）
		// pdf.TransformBegin()
		// pdf.TransformRotate(45, pageWidth/2, pageHeight/2)
		// pdf.Text(pageWidth/2-40, pageHeight/2+20, watermarkText)
		// pdf.TransformEnd()

		// // 添加多个水印（平铺效果）
		// for i := 0.0; i < pageHeight; i += 100 {
		// 	for j := 0.0; j < pageWidth; j += 150 {
		// 		pdf.Text(j, i, watermarkText)
		// 	}
		// }

		// 计算水印间距
		spacingX := textWidth * 1.5
		spacingY := textHeight * 1.5

		// 计算对角线长度（用于确定平铺数量）
		diagonal := math.Sqrt(pageWidth*pageWidth + pageHeight*pageHeight)
		numX := int(diagonal/spacingX) + 2
		numY := int(diagonal/spacingY) + 2

		// 保存当前变换状态
		pdf.TransformBegin()

		// 旋转坐标系45度（以页面中心为旋转点）
		pdf.TransformRotate(45, pageWidth/2, pageHeight/2)

		// 计算偏移量，使水印从左上角开始
		offsetX := -diagonal / 2
		offsetY := -diagonal / 2

		// 添加平铺水印
		for i := range numY {
			y := offsetY + float64(i)*spacingY
			for j := range numX {
				x := offsetX + float64(j)*spacingX
				pdf.Text(x, y, watermarkText)
			}
		}
		// 恢复变换状态
		pdf.TransformEnd()

		// 重置透明度
		pdf.SetAlpha(1.0, "Normal")
		// 恢复原始状态
		pdf.SetXY(currentX, currentY)
	}

	// 添加图片水印
	if addImageWatermark {
		watermarkPath := "config/do-not-copy-160137_1280.png"
		// 保存当前状态
		currentX, currentY := pdf.GetXY()

		if _, err := os.Stat(watermarkPath); err == nil {
			// 设置透明度
			pdf.SetAlpha(0.15, "Normal") // 20%透明度

			/* // 计算水印位置和大小
			watermarkWidth := 100.0
			watermarkHeight := 40.0
			x := (pageWidth - watermarkWidth) / 2
			y := (pageHeight - watermarkHeight) / 2

			// 添加中心水印
			pdf.ImageOptions(watermarkPath, x, y, watermarkWidth, watermarkHeight, false,
				gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true}, 0, "")

			// 添加平铺水印
			for i := 0.0; i < pageHeight; i += watermarkHeight + 30 {
				for j := 0.0; j < pageWidth; j += watermarkWidth + 50 {
					pdf.ImageOptions(watermarkPath, j, i, watermarkWidth, watermarkHeight, false,
						gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true}, 0, "")
				}
			} */
			// 获取图片尺寸（毫米）
			imgWidth := 30.0  // 水印宽度30mm
			imgHeight := 10.0 // 水印高度10mm（保持比例）

			// 计算横向和纵向需要的水印数量
			spacingX := imgWidth * 2.0  // 间距为图片宽度的2倍
			spacingY := imgHeight * 4.0 // 间距为图片高度的2倍

			// 计算横向和纵向需要的水印数量
			numX := int(pageWidth/imgWidth) + 1
			numY := int(pageHeight/imgHeight) + 1

			// 计算起始位置（左上角）
			startX := 0.0
			startY := 0.0

			// 从左上角开始平铺
			for i := 0; i < numY; i++ {
				y := startY + float64(i)*spacingY
				for j := 0; j < numX; j++ {
					x := startX + float64(j)*spacingX
					pdf.ImageOptions(watermarkPath,
						x, y, imgWidth, imgHeight,
						false,
						gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true},
						0, "")
				}
			}

			// 计算横向和纵向需要的水印数量
			// numX := int(pageWidth/imgWidth) + 1
			// numY := int(pageHeight/imgHeight) + 1

			// 计算水印间距
			// spacingX := imgWidth * 1.8
			// spacingY := imgHeight * 1.8

			// 计算对角线长度（用于确定平铺数量）
			// diagonal := math.Sqrt(pageWidth*pageWidth + pageHeight*pageHeight)
			// numX := int(diagonal/spacingX) + 2
			// numY := int(diagonal/spacingY) + 2

			// 旋转坐标系45度（以页面中心为旋转点）
			// pdf.TransformRotate(45, pageWidth/2, pageHeight/2)

			// 计算偏移量，使水印从左上角开始
			// offsetX := -diagonal / 2
			// offsetY := -diagonal / 2

			// // 添加平铺水印
			// for i := range numY {
			// 	y := offsetY + float64(i)*spacingY
			// 	for j := range numX {
			// 		x := offsetX + float64(j)*spacingX
			// 		pdf.ImageOptions(watermarkPath,
			// 			x, y, imgWidth, imgHeight,
			// 			false,
			// 			gofpdf.ImageOptions{ImageType: "PNG", ReadDpi: true},
			// 			0,
			// 			"",
			// 		)
			// 	}
			// }

			// 重置透明度
			pdf.SetAlpha(1.0, "Normal")
			pdf.SetXY(currentX, currentY)
		} else {
			log.Printf("水印图片缺失: %v", err)
		}
	}
}

func addSvgWatermarkWithSpacing(pdf *gofpdf.Fpdf) {
	// 获取页面尺寸
	pageWidth, pageHeight := pdf.GetPageSize()

	// 保存当前状态
	currentX, currentY := pdf.GetXY()

	// 设置透明度
	pdf.SetAlpha(0.5, "Normal")

	// SVG水印内容
	svgContent := `
	<svg width="100" height="40" viewBox="0 0 100 40" xmlns="http://www.w3.org/2000/svg">
		<rect x="10" y="5" width="80" height="30" fill="none" stroke="gray" stroke-width="1" stroke-opacity="0.5"/>
		<text x="50" y="25" font-size="20" fill="gray" fill-opacity="0.5" text-anchor="middle">机密</text>
	</svg>
	`

	// 解析SVG内容
	svg, err := gofpdf.SVGBasicParse([]byte(svgContent))
	if err != nil {
		log.Printf("解析SVG失败: %v", err)
		return
	}
	log.Printf("SVG===Wd: %v", svg.Wd)

	// 水印尺寸
	imgWidth := 30.0  // mm
	imgHeight := 12.0 // mm

	// 计算缩放比例（基于原始SVG尺寸）
	// SVG原始宽度（像素）到毫米的转换：1像素 = 25.4/72 mm
	originalWidthMM := float64(svg.Wd) * 25.4 / 72
	scale := imgWidth / originalWidthMM

	// 设置较大的间距（原始尺寸的2倍）
	spacingX := imgWidth * 2.0
	spacingY := imgHeight * 2.0

	// 计算横向和纵向需要的水印数量
	numX := int(pageWidth/spacingX) + 1
	numY := int(pageHeight/spacingY) + 1

	// 计算起始位置（居中）
	startX := (pageWidth - (float64(numX-1) * spacingX)) / 2
	startY := (pageHeight - (float64(numY-1) * spacingY)) / 2

	// 添加平铺水印
	for i := 0; i < numY; i++ {
		for j := 0; j < numX; j++ {
			x := startX + float64(j)*spacingX
			y := startY + float64(i)*spacingY
			// 设置当前位置
			pdf.SetXY(x, y)

			// 添加SVG水印
			pdf.SVGBasicWrite(&svg, scale)
		}
	}

	// 重置透明度
	pdf.SetAlpha(1.0, "Normal")

	// 恢复原始位置
	pdf.SetXY(currentX, currentY)
}

func getImageDimensions(imagePath string) (float64, float64, error) {
	// 打开图片文件
	file, err := os.Open(imagePath)
	if err != nil {
		return 0, 0, err
	}
	defer file.Close()

	// 解码图片获取尺寸
	img, _, err := image.DecodeConfig(file)
	if err != nil {
		return 0, 0, err
	}

	// 假设72dpi（1英寸=25.4毫米）
	// 像素转毫米公式：毫米 = (像素 * 25.4) / dpi
	dpi := 72.0
	widthMM := float64(img.Width) * 25.4 / dpi
	heightMM := float64(img.Height) * 25.4 / dpi

	return widthMM, heightMM, nil
}
